<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>操作符</title>
</head>
<body>
    <script>
        "use strict";
        /*
            ECMA-262描述了一组用于操作数据值的操作符，包括算术操作符（包括加号和减号）、位操作符、关系操作符和相等操作符等。
            ECMA-262操作符的与众不同之处在于，它们能够适用于很多值，例如字符串、数值、布尔值，甚至对象。不过，在应用于对象时，
            相应的操作符都会调用对象的valueOf()方法或toString()方法，以便取得可以操作的值。

            一元操作符：
                只能操作一个值的操作符叫做一元操作符。一元操作符是ECMAScript中最简单的操作符。

                1、递增和递减操作符 [++ --]
                    递增和递减操作符直接借鉴C，而且各有两个版本：前置型和后置型。顾名思义，前置型应该位于要操作的变量前面，
                    而后置型则应该位于要操作的变量之后。
                    
                    执行前置递增和递减操作时，变量的值都是在语句被求值之前改变的。
                    
                    后置型递增和递减操作符的语法不变，只不过要放在变量的后面，而不是前面，后置递增和递减与前置递增和递减有一个
                    非常重要的区别：即递增和递减操作是在包含他们的语句是在求值之后才执行的。

                    这4个操作符对任何值都适用，也就是他们不仅仅适用于整数，还可以用于字符串、布尔值、浮点值和对象。在应用于不同的值时，
                    递增和递减操作符遵循下列规则：
                        在应用于一个包含有效数字字符的字符串时，先将其转换为数字值，在执行加减1的操作。字符串变量变成数值变量
                        在应用于一个不包含有效数字字符的字符串时，将变量的值设置为NaN。字符串变量变成数值变量
                        在应用于布尔值false时，先将其转换为0再执行加减1的操作
                        在应用于布尔值true时，先将其转换为1再执行加减1的操作
                        在应用于浮点数值时，执行加减1的操作
                        在应用于对象时，先调用对象的valueOf()方法以取得一个可操作的值。然后对该值应用上述规则，如果结果是NaN，则再调用
                            toString()方法后再应用上述规则，对象变量最终变成数值变量。

                2、一元加和减操作符 [+ -]
                    绝大多数开发人员对一元加和减操作符都不会陌生，而且这两个ECMAScript操作符的作用与数学书上讲的完全一样。
                    
                    一元加操作符以一个加号(+)表示，放在数值前面，对数值不会产生任何影响。不过在对非数值应用一元加操作符时，
                    该操作符会像Number()转型函数一样对这个值执行转换。换句话说，布尔值false和true将会被转换成0和1，字符串值
                    会被按照一种特殊的规则解析，而对象是先调用valueOf()方法或toString()方法，在转换得到值。

                    一元减操作符主要用于表示负数。在将一元减操作符应用于数值时，该值会变成负数，二挡应用于非数值时，一元减操作符遵循
                    与一元加操作符相同的规则，最后再将得到的数值转换成负数。

        */
        
        // 一元递增和递减操作符

        console.log("--------一元递增和递减操作符--------");
        var age = 29;
        var anotherAge = --age + 2;
        console.log(age); // 28
        console.log(anotherAge); // 30

        var o = {
            valueOf: function() {
                return "a";
            },
            toString: function() {
                return "0";
            }
        };

        ++o;
        console.log(o);
        
        // 一元加和减操作符
        console.log("--------一元加和减操作符--------");
        var s1 = "01";
        var s2 = "1.1";
        var s3 = "z";
        var b = false;
        var f = 1.1;
        var o1 = {
            valueOf: function() {
                return 1;
            }
        };

        console.log(+s1); // 1
        console.log(+s2); // 1.1
        console.log(+s3); // NaN
        console.log(+b); // 0
        console.log(+f); // 1.1
        console.log(+o1); // 1

    </script>
</body>
</html>